package com.mairuide.menuuser;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.mairuide._frame.base.BaseRepository;
import com.mairuide._frame.base.BaseServiceProxy;
import com.mairuide._frame.utils.Tools;
import com.mairuide.menuinfo.MenuInfoService;
import com.mairuide.platmanager.PlatManagerService;

@Service
@Transactional(readOnly = true)
public class MenuUserService extends BaseServiceProxy<MenuUser> {

	@Resource
	private MenuInfoService menuInfoService;

	@Resource
	private PlatManagerService platManagerService;
	
	@Resource
	private MenuUserRepository menuUserRepository;

	@Override
	protected BaseRepository<MenuUser> getBaseRepository() {
		return menuUserRepository;
	}
	
	/**
	 * 查询该用户的权限
	 * @param userId
	 * @return
	 */
	public List<MenuUser> findByUserId (Integer userId) {
		return menuUserRepository.findByUserIdOrderByMenuIdAsc(userId);
	}
	
	/**
	 * 具体账号授权
	 * 
	 * @param userId
	 * @param menuIdArr
	 */
	@Transactional(readOnly = false)
	public void authMenu(Integer userId, Integer[] menuIdArr) {
		
		// menuIdArr为空，表示取消这个用户的所有权限
		if (menuIdArr == null || menuIdArr.length == 0) {
			// 先删除这个用户的所有权限
			menuUserRepository.deleteByUserId(userId);
			// 再添加一条使用账号权限的标记数据
			MenuUser menuUser = new MenuUser();
			menuUser.setUserId(userId);
			menuUser.setMenuId(null);
			menuUserRepository.save(menuUser);
		} else {
			Set<Integer> newMenuIdSet = new HashSet<Integer>(Arrays.asList(menuIdArr));
			// 新传过的菜单ID中没有一级菜单ID，要加上。
			Set<Integer> menuParentIdSet = menuInfoService.findMenuParentIdByMenuIdIn(newMenuIdSet);
			newMenuIdSet.addAll(menuParentIdSet);
			
			// 查询该用户目前的菜单权限
			List<MenuUser> oldMenuRoleList = menuUserRepository.findByUserIdOrderByMenuIdAsc(userId);
			Set<Integer> oldMenuIdSet = oldMenuRoleList.stream().map(mu -> mu.getMenuId()).collect(Collectors.toSet());
			
			// 区分出哪些是新增权限，哪些是删除的权限
			Tools.diffNewOrDel(oldMenuIdSet, newMenuIdSet);
			
			// 需要增加的菜单权限
			if (newMenuIdSet != null && !newMenuIdSet.isEmpty()) {
				List<MenuUser> saveList = new ArrayList<MenuUser>();
				for (Integer menuId: newMenuIdSet) {
					MenuUser menuUser = new MenuUser();
					menuUser.setUserId(userId);
					menuUser.setMenuId(menuId);
					saveList.add(menuUser);
				}
				menuUserRepository.save(saveList);
			}
			// 需要删除的菜单权限
			if (oldMenuIdSet != null && oldMenuIdSet.size() > 0) {
				menuUserRepository.deleteByUserIdAndMenuIdIn(userId, oldMenuIdSet);
			}
		}
	}

}
